#include <iostream>
#include <string>
#include <unistd.h>
#include <mysql/mysql.h>
using std::cin;
using std::cout;
using std::endl;

// const std::string host = "localhost";
const std::string host = "localhost";
const std::string user = "keli";
const std::string password = "keli1489044750";
const std::string db = "study_mysql_2";
const unsigned int port = 8080;
int main()
{
    // cout<< "mysql client Version:"<< mysql_get_client_info()<<endl;
    MYSQL *my = mysql_init(nullptr); // mysql_init：初始化MySQL连接
    if (nullptr == my)
    {
        std::cerr << "MYSQL init error" << std::endl;
        return 1;
    }
    // mysql_real_connect：连接mysql数据库函数
    if (mysql_real_connect(my, host.c_str(), user.c_str(), password.c_str(), db.c_str(), port, nullptr, 0) == nullptr)
    {
        std::cerr << "connect MYSQL error!" << endl;
        return 2;
    }
    // mysql_set_character_set：设置字符集与mysql匹配函数
    mysql_set_character_set(my, "utf8");
    // int a = mysql_set_character_set(my, "utf8");
    // cout<<a<<endl;
    // std::string sql="insert into user(name,age,telphone) values('keli',45,'3125235')";
    // std::string sql="insert into user(id,name,age,telphone) values(12,'keli',104,'1214352512')";
    // std::string sql="insert into user(id,name,age,telphone) values(112,'柯礼',14,'1214123')";
    // std::string sql="insert into user(id,name,age,telphone) values(100,'柯美纯',22,'1321546')";
    std::string sql = "select * from user";

    // mysql_query：发送sql语句给mysql函数
    int n = mysql_query(my, sql.c_str());//这里可以直接begin，然后下面commit
    if (n == 0)
        cout << sql << " successful:" << n << endl;
    else
    {
        cout << sql << " failed" << endl;
        return 3;
    }

    /////下面开始与my无关，都是与结果集有关的函数
    MYSQL_RES *res = mysql_store_result(my); // 获取my中的处理查询结果的函数,insert,update,delete都不需要用到这个函数
    //注意！这里的res是一个结果集！那么是一定要开辟空间存放的，所以我们最后要调用mysql_free_result来释放这个结果集
    if (nullptr == res)
    {
        std::cerr << "mysql_store_result error" << std::endl;
        return 4;
    }

    // my_ulonglong就是无符号long long 类型
    int rows = mysql_num_rows(res);    // 获取select得到结果有多少行函数
    int fiels = mysql_num_fields(res); // 获取select得到结果有多少列函数
    std::cout<<"行:"<<rows<<endl<<"列:"<<fiels<<endl;

    //与表属性有关
    //mysql_fetch_field：依次获取表的每一列的属性名称，自动控制，我们不用控制
    //mysql_fetch_fields: 一次获取出表的所有属性名称，用数组存放
    MYSQL_FIELD * fiels_array = mysql_fetch_fields(res);
    for(int i=0;i<fiels;++i)
    {
        //.db和.table：拿到使用的库和表名称
        std::cout<<fiels_array[i].name<<"\t";//name拿到所有属性列名称
    }
    std::cout<<std::endl;

    //与表内容有关
    for (int i = 0; i < rows; ++i)
    {
        MYSQL_ROW row = mysql_fetch_row(res); // 从结果集中获取一行数据，这个函数类似于迭代器，我们不需要控制，它会自己控制
        for(int j=0;j<fiels;++j)
        {
            std::cout<<row[j]<<"\t";
        }
        std::cout<<std::endl;
    }










    // std::string sql;
    //  while (true)
    //  {
    //      cout << "MYSQL >>> : ";
    //      if (!std::getline(std::cin, sql) || sql == "quit")
    //      {
    //          std::cout<<"Bye Bye"<<std::endl;
    //          break;
    //      }
    //      int n = mysql_query(my, sql.c_str());
    //      if (n == 0)
    //          cout << sql << "successful:" << n << endl;
    //      else
    //          cout << sql << "failed" << endl;
    //  }
    // std::cout << "connect success!" << std::endl;

    mysql_free_result(res);//释放掉结果集存放的空间

    mysql_close(my);  // mysql_close：关闭一个之前由mysql_connect打开的非持久连接
    return 0;
}
